package net.hands.common.mail;

import java.io.File;
import java.util.Date;
import java.util.LinkedList;

import net.hands.common.MimeTypes;
/**
 * 
 * 说明:邮件
 * <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public class Email extends CommonEmail {
   /**
   * 说明:创建邮件
   * @return Email
   * @update 2012-9-21 上午9:58:39
    */
	public static Email create() {
		return new Email();
	}

	// ---------------------------------------------------------------- from, to,
   /**
   * 说明:创建邮件
   * @param from  来源
   * @return Email 
   * @update 2012-9-21 上午9:58:51
    */
	public Email from(final String from) {
		setFrom(from);
		return this;
	}
   /**
   * 说明:发送地址
   * @param to 发送地址
   * @return Email 邮件
   * @update 2012-9-21 上午10:00:15
    */
	public Email to(final String to) {
		setTo(to);
		return this;
	}
   /**
   * 说明:发送地址
   * @param tos  0~多个发送地址
   * @return Email 邮件
   * @update 2012-9-21 上午10:00:32
    */
	public Email to(final String... tos) {
		setTo(tos);
		return this;
	}
   /**
   * 说明:回复地址
   * @param replyTo 回复地址
   * @return Email
   * @update 2012-9-21 上午10:01:34
    */
	public Email replyTo(final String replyTo) {
		setReplyTo(replyTo);
		return this;
	}
   /**
   * 说明:回复地址 
   * @param replyTos 0~多个回复地址
   * @return Email
   * @update 2012-9-21 上午10:02:10
    */
	public Email replyTo(final String... replyTos) {
		setReplyTo(replyTos);
		return this;
	}
   /**
   * 说明:抄送地址 
   * @param cc 抄送地址
   * @return Email
   * @update 2012-9-21 上午10:02:26
    */
	public Email cc(final String cc) {
		setCc(cc);
		return this;
	}
   /**
   * 说明:抄送地址
   * @param ccs 0~多个抄送地址
   * @return Email
   * @update 2012-9-21 上午10:02:49
    */
	public Email cc(final String... ccs) {
		setCc(ccs);
		return this;
	}
   /**
   * 说明:用一句话描述文件做什么
   * @param bcc 被抄送地址
   * @return Email
   * @update 2012-9-21 上午10:03:07
    */
	public Email bcc(final String bcc) {
		setBcc(bcc);
		return this;
	}
   /**
   * 说明:被抄送地址
   * @param bccs 0~多个被抄送地址
   * @return Email
   * @update 2012-9-21 上午10:03:46
    */
	public Email bcc(final String... bccs) {
		setBcc(bccs);
		return this;
	}

	// ---------------------------------------------------------------- subject
   /**
   * 说明:主题
   * @param subject 主题
   * @return Email
   * @update 2012-9-21 上午10:04:16
    */
	public Email subject(final String subject) {
		setSubject(subject);
		return this;
	}

	// ---------------------------------------------------------------- message
   /**
   * 说明:添加内容
   * @param text 内容
   * @return Email
   * @update 2012-9-21 上午10:05:12
    */
	public Email addText(final String text) {
		messages.add(new EmailMessage(text));
		return this;
	}
   /**
   * 说明:添加内容 
   * @param text 内容
   * @param encoding 编码
   * @return Email
   * @update 2012-9-21 上午10:05:30
    */
	public Email addText(final String text, final String encoding) {
		messages.add(new EmailMessage(text, MimeTypes.MIME_TEXT_PLAIN, encoding));
		return this;
	}
   /**
   * 说明:添加html
   * @param message 信息
   * @return Email
   * @update 2012-9-21 上午10:05:51
    */
	public Email addHtml(final String message) {
		messages.add(new EmailMessage(message, MimeTypes.MIME_TEXT_HTML));
		return this;
	}
   /**
   * 说明:添加html 
   * @param message 信息
   * @param encoding 编码
   * @return Email
   * @update 2012-9-21 上午10:06:12
    */
	public Email addHtml(final String message, final String encoding) {
		messages.add(new EmailMessage(message, MimeTypes.MIME_TEXT_HTML, encoding));
		return this;
	}
   /**
   * 说明:添加信息
   * @param text     内容
   * @param mimeType 协议类型
   * @param encoding 编码
   * @return Email
   * @update 2012-9-21 上午10:07:12
    */
	public Email message(final String text, final String mimeType, final String encoding) {
		addMessage(text, mimeType, encoding);
		return this;
	}
   /**
   * 说明:添加信息
   * @param text     内容
   * @param mimeType 协议类型
   * @return Email
   * @update 2012-9-21 上午10:07:28
    */
	public Email message(final String text, final String mimeType) {
		addMessage(text, mimeType);
		return this;
	}

	// attachments
   /**
    * 附件
    */
	protected LinkedList<EmailAttachment> attachments;
   /**
   * 说明:获得附件
   * @return LinkedList<EmailAttachment>
   * @update 2012-9-21 上午10:08:04
    */
	public LinkedList<EmailAttachment> getAttachments() {
		if (attachments == null) {
			return null;
		}
		return attachments;
	}
   /**
   * 说明:附加附件
   * @param emailAttachment 附件
   * @return Email
   * @update 2012-9-21 上午10:08:22
    */
	public Email attach(final EmailAttachment emailAttachment) {
		if (attachments == null) {
			attachments = new LinkedList<EmailAttachment>();
		}
		attachments.add(emailAttachment);
		return this;
	}
  /**
  * 说明:附加字节
  * @param bytes 字节数组
  * @param contentType 内容类型
  * @param name 名称
  * @return Email
  * @update 2012-9-21 上午10:08:55
   */
	public Email attachBytes(final byte[] bytes, final String contentType, final String name) {
		attach(new ByteArrayAttachment(bytes, contentType, name));
		return this;
	}
   /**
    * 说明:附加文件
   * @param fileName 文件名
   * @return Email 
   * @update 2012-9-21 上午10:09:12
    */
	public Email attachFile(final String fileName) {
		attach(new FileAttachment(new File(fileName)));
		return this;
	}
   /**
   * 说明:附加文件
   * @param file 文件
   * @return Email
   * @update 2012-9-21 上午10:09:26
    */
	public Email attachFile(final File file) {
		attach(new FileAttachment(file));
		return this;
	}
   /**
   * 说明:插入文件
   * @param fileName 文件名
   * @param contentId 内容id
   * @return Email
   * @update 2012-9-21 上午10:09:43
    */
	public Email embedFile(final String fileName, final String contentId) {
		final File f = new File(fileName);
		attach(new FileAttachment(f, f.getName(), contentId));
		return this;
	}
  /**
  * 说明:插入文件
  * @param file 文件
  * @param contentId 内容id
  * @return Email
  * @update 2012-9-21 上午10:10:08
   */
	public Email embedFile(final File file, final String contentId) {
		attach(new FileAttachment(file, file.getName(), contentId));
		return this;
	}
   /**
   * 说明:插入文件
   * @param fileName 文件名
   * @return  Email
   * @update 2012-9-21 上午10:12:21
    */
	public Email embedFile(final String fileName) {
		attach(new FileAttachment(new File(fileName), true));
		return this;
	} 
   /**
   * 说明:插入文件
   * @param file 文件
   * @return Email
   * @update 2012-9-21 上午10:12:44
    */
	public Email embedFile(final File file) {
		attach(new FileAttachment(file, true));
		return this;
	}

	// ---------------------------------------------------------------- headers
   /**
   * 说明:信息头
   * @param name 键
   * @param value 值
   * @return Email
   * @update 2012-9-21 上午10:13:02
    */
	public Email header(final String name, final String value) {
		setHeader(name, value);
		return this;
	}
   /**
   * 说明:优先级
   * @param priority
   * @return Email
   * @update 2012-9-21 上午10:13:32
    */
	public Email priority(final int priority) {
		super.setPriority(priority);
		return this;
	}

	// ---------------------------------------------------------------- date
   /**
   * 说明:当前发送时间
   * @return Email
   * @update 2012-9-21 上午10:14:07
    */
	public Email setCurrentSentDate() {
		sentDate = new Date();
		return this;
	}
   /**
   * 说明:定制发送时间
   * @param date 日期
   * @return Email
   * @update 2012-9-21 上午10:14:32
    */
	public Email sentOn(final Date date) {
		setSentDate(date);
		return this;
	}

	// ---------------------------------------------------------------- toString
   /**
    * 
   (non-Javadoc)  
   * @see java.lang.Object#toString()  
   * @update 2012-9-21 上午10:15:02
    */
	@Override
	public String toString() {
		return "Email{'" + from + "\', subject='" + subject + "\'}";
	}
}
